/*
 * main.cpp
 *
 *  Created on: 05-nov-2008
 *      Author: alu3607
 */

#include <iostream>
#include <LEDA/core/array.h>

#include <LEDA/graph/ugraph.h>
#include <LEDA/graphics/graphwin.h>
#include <LEDA/core/string.h>
#include <LEDA/graph/node_array.h>
#include <LEDA/core/list.h>

#include "Rutas.h"

using namespace leda;
using namespace std;


bool running;

void setDirigido(GraphWin & GW) {
	GRAPH<int, int> &G = (GRAPH<int, int> &) GW.get_graph();
	G.make_directed();
	GW.set_directed(true);
}

void setNoDirigido(GraphWin & GW) {
	GRAPH<int, int> &G = (GRAPH<int, int> &) GW.get_graph();
	G.make_undirected();
	GW.set_directed(false);
}

void fleury (GraphWin& GW) {
	GRAPH<int, int> &G = (GRAPH<int, int> &) GW.get_graph();
	Rutas rutas;
	if (rutas.fleury(G, GW)) {
		GW.update_graph();
	} else {
		GW.wait("No se puede resolver");
	}
}

void carteroChino(GraphWin& GW) {
	GRAPH<int, int> &G = (GRAPH<int, int> &) GW.get_graph();
	Rutas rutas;
	if (rutas.carteroChino(G, GW)) {
		GW.update_graph();
	} else {
		GW.wait("No se puede resolver");
	}
}

void tsp(GraphWin& GW) {
	Rutas rutas;
	rutas.tspAsimetrico(GW);
}

void pesosPositivos(GraphWin & GW) {
    GRAPH<int, int> &G = (GRAPH<int, int> &) GW.get_graph();
    edge e;

    forall_edges(e, G) {
        G[e] = rand() % 30;
    }
    GW.set_edge_label_type(user_label, false);
    GW.set_edge_label_type(data_label, true);
}

void genTSP(GraphWin& GW){
    complete_graph(GW.get_graph(), 9);
	GW.update_graph();
	GW.center_graph();
	GW.wait(0.5);
	gw_circle_embed(GW);
}

int main() {
	GRAPH<int, int> G;
	GraphWin GW(G, "Ejemplo de grafo no dirigido");
	int MenuTipoGrafo = GW.add_menu("Grafo");
	GW.add_simple_call(setDirigido, "Dirigido", MenuTipoGrafo);
	GW.add_simple_call(setNoDirigido, "No Dirigido", MenuTipoGrafo);
	GW.add_simple_call(pesosPositivos, "Pesos positivos", MenuTipoGrafo);
	GW.add_simple_call(genTSP, "Grafo completo", MenuTipoGrafo);

	int MenuRutas = GW.add_menu("Rutas");
	GW.add_simple_call(fleury, "Fleury", MenuRutas);
	GW.add_simple_call(carteroChino, "Cartero chino", MenuRutas);
	GW.add_simple_call(tsp, "TSP", MenuRutas);

	GW.open();
	GW.close();
}
